home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
QRZ! Ham Radio 8
/
QRZ Ham Radio Callsign Database - Volume 8.iso
/
mac
/
files
/
t_sys5
/
92052tar.gz
/
920528.tar
/
remote_kbd.c
< prev
next >
Wrap
C/C++ Source or Header
|
1991-10-13
|
2KB
|
101 lines
/* @(#) $Header: remote_kbd.c,v 1.12 91/10/11 18:56:35 deyke Exp $ */
#include <sys/types.h>
#include <stdio.h>
#include <sys/socket.h>
#include <unistd.h>
#include "global.h"
#include "hpux.h"
#include "buildsaddr.h"
#include "main.h"
extern char Prompt[];
static int fkbd = -1;
static int flisten = -1;
static void accept_connection __ARGS((void *p));
/*---------------------------------------------------------------------------*/
int dobye(argc, argv, p)
int argc;
char *argv[];
void *p;
{
if (fkbd >= 0) {
freopen("/dev/null", "r+", stdin);
freopen("/dev/null", "r+", stdout);
freopen("/dev/null", "r+", stderr);
off_read(fkbd);
fkbd = -1;
}
return 0;
}
/*---------------------------------------------------------------------------*/
static void accept_connection(p)
void *p;
{
char buf[1024];
int addrlen, fd;
struct sockaddr addr;
addrlen = sizeof(addr);
if ((fd = accept(flisten, &addr, &addrlen)) < 0) return;
if (fkbd >= 0) {
sprintf(buf, "*** %s busy\n", Hostname);
write(fd, buf, strlen(buf));
close(fd);
return;
}
fflush(stdin);
fflush(stdout);
fflush(stderr);
dup2(fd, 0);
dup2(fd, 1);
dup2(fd, 2);
close(fd);
fkbd = 0;
on_read(fkbd, (void (*)()) keyboard, (void *) 0);
printf(Prompt, Hostname);
}
/*---------------------------------------------------------------------------*/
void remote_kbd_initialize()
{
#if (defined(hpux)||defined(__hpux))
#define NETKBD_SOCKET "unix:/tcp/.sockets/netkbd"
#else
#define NETKBD_SOCKET "*:4720"
#endif
int addrlen;
int arg;
struct sockaddr *addr;
if (!(addr = build_sockaddr(NETKBD_SOCKET, &addrlen))) return;
if ((flisten = socket(addr->sa_family, SOCK_STREAM, 0)) < 0) return;
switch (addr->sa_family) {
case AF_UNIX:
if (!Debug) unlink(addr->sa_data);
break;
case AF_INET:
arg = 1;
setsockopt(flisten, SOL_SOCKET, SO_REUSEADDR, (char *) &arg, sizeof(arg));
break;
}
if (bind(flisten, addr, addrlen) || listen(flisten, SOMAXCONN)) {
close(flisten);
return;
}
on_read(flisten, accept_connection, (void *) 0);
}